Control Towerのリージョン拒否コントロール(Region deny control)を設定してみる

Control Towerのリージョン拒否コントロール(Region deny control)を設定してみる

Clock Icon2025.01.16

はじめに

こんにちは、和田です。

この記事ではControl Towerの機能の1つであるリージョン拒否コントロール(Region deny control)についてまとめます。

リージョン拒否コントロール(Region deny control)とは

リージョン拒否コントロール(Region deny control)とは、Control Towerの機能の1つで、ホームリージョンおよびランディングゾーンリージョン以外でのAPI実行を禁止するものです。

ランディングゾーン全体に適用されるため、Control Towerに登録されたOUの中で例外を作ることはできません。
https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/region-deny.html

リージョン拒否コントロールの実態は、Control Towerに登録されたOUに対して、特定のリージョン以外への操作を禁止するSCPを自動で付与するものです。グローバルリソースへの例外設定などもいい感じに設定してくれているので、利用者として設計時の考慮事項が減って嬉しい限りです。

リージョン拒否コントロール有効化時に付与されるSCP

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GRREGIONDENY",
            "Effect": "Deny",
            "NotAction": [
                "a4b:*",
                "access-analyzer:*",
                "account:*",
                "acm:*",
                "activate:*",
                "artifact:*",
                "aws-marketplace-management:*",
                "aws-marketplace:*",
                "aws-portal:*",
                "billing:*",
                "billingconductor:*",
                "budgets:*",
                "ce:*",
                "chatbot:*",
                "chime:*",
                "cloudfront:*",
                "cloudtrail:LookupEvents",
                "compute-optimizer:*",
                "config:*",
                "consoleapp:*",
                "consolidatedbilling:*",
                "cur:*",
                "datapipeline:GetAccountLimits",
                "devicefarm:*",
                "directconnect:*",
                "ec2:DescribeRegions",
                "ec2:DescribeTransitGateways",
                "ec2:DescribeVpnGateways",
                "ecr-public:*",
                "fms:*",
                "freetier:*",
                "globalaccelerator:*",
                "health:*",
                "iam:*",
                "importexport:*",
                "invoicing:*",
                "iq:*",
                "kms:*",
                "license-manager:ListReceivedLicenses",
                "lightsail:Get*",
                "mobileanalytics:*",
                "networkmanager:*",
                "notifications-contacts:*",
                "notifications:*",
                "organizations:*",
                "payments:*",
                "pricing:*",
                "quicksight:DescribeAccountSubscription",
                "resource-explorer-2:*",
                "route53-recovery-cluster:*",
                "route53-recovery-control-config:*",
                "route53-recovery-readiness:*",
                "route53:*",
                "route53domains:*",
                "s3:CreateMultiRegionAccessPoint",
                "s3:DeleteMultiRegionAccessPoint",
                "s3:DescribeMultiRegionAccessPointOperation",
                "s3:GetAccountPublicAccessBlock",
                "s3:GetBucketLocation",
                "s3:GetBucketPolicyStatus",
                "s3:GetBucketPublicAccessBlock",
                "s3:GetMultiRegionAccessPoint",
                "s3:GetMultiRegionAccessPointPolicy",
                "s3:GetMultiRegionAccessPointPolicyStatus",
                "s3:GetStorageLensConfiguration",
                "s3:GetStorageLensDashboard",
                "s3:ListAllMyBuckets",
                "s3:ListMultiRegionAccessPoints",
                "s3:ListStorageLensConfigurations",
                "s3:PutAccountPublicAccessBlock",
                "s3:PutMultiRegionAccessPointPolicy",
                "savingsplans:*",
                "shield:*",
                "sso:*",
                "sts:*",
                "support:*",
                "supportapp:*",
                "supportplans:*",
                "sustainability:*",
                "tag:GetResources",
                "tax:*",
                "trustedadvisor:*",
                "vendor-insights:ListEntitledSecurityProfiles",
                "waf-regional:*",
                "waf:*",
                "wafv2:*"
            ],
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "aws:RequestedRegion": []
                },
                "ArnNotLike": {
                    "aws:PrincipalARN": [
                        "arn:aws:iam::*:role/AWSControlTowerExecution"
                    ]
                }
            }
        }
    ]
}

これとよく似た概念で、OUに適用されたリージョン拒否コントロール(Region deny control applied to the OU)というものもありますが、この記事では説明を割愛します。詳しくはこちらのブログを参照ください。
https://dev.classmethod.jp/articles/aws-control-tower-denies-regions-to-ou/

リージョン制限のメリット

AWSでは約30個のリージョンが利用可能です。
世界中の多くの地域にリソースを作れるのは嬉しい反面、それらを全て管理するのは困難です。

セキュリティ面では「悪意のある第三者への不正アクセスを許し、リソースを起動された」という場合、作成先が普段使わないリージョンだと発見が遅れるリスクがあります。

コスト面でも、「検証用に誤って別リージョンに作成したリソースが、誰にも気づかれず削除されることもなく利用費を払い続けていた」なんてことが起こるかもしれません。

使う予定のないリージョンへの操作をあらかじめ制限しておくことで、こういったリスクを軽減できます。

注意点

前述の通り、リージョン拒否コントロールを有効にすると指定したリージョン以外でのAPI操作を禁止されます。
したがって、有効にする前に作成したリソースがあった場合に削除することができません。

リージョン拒否コントロールを有効にする前に、制限されるリージョンにリソースがないことを確認しましょう!

やってみる

リージョン拒否コントロールはControl Tower有効化時でも、有効化したあとでも設定が可能です。
今回はあらかじめControl Towerを有効化した環境でリージョン拒否コントロールを有効にしていこうと思います。

まずはリージョン拒否コントロールを有効にしたい環境の管理アカウントにログインし、「Control Tower」のコンソールを開きます。

サイドタブから「ランディングゾーン設定」をクリックします。
スクリーンショット 2025-01-15 23.36.28.png

ランディングゾーン設定の「設定を変更する」をクリックします。
スクリーンショット 2025-01-16 15.44.36.png

「リージョン拒否設定」の「有効」をクリックします。
スクリーンショット 2025-01-15 23.37.21.png

それ以外の項目は変更せず、「ランディングゾーンの更新」をクリックします。
スクリーンショット 2025-01-15 23.38.39.png

ランディングゾーンの更新には30ほどかかるので待ちます。
スクリーンショット 2025-01-15 23.38.54.png

「リージョン拒否コントロール」のステータスが有効になっていれば、設定完了です。
スクリーンショット 2025-01-16 15.51.04.png

確認

今回の環境では以下のリージョンを設定しているので、それ以外のリージョンに切り替えて検証します。

  • ホームリージョン:東京
  • 追加リージョン:大阪、バージニア、オレゴン

メンバーアカウントにログインし、ロンドンリージョンに切り替えてみます。
「EC2」のコンソールを開くと、、、
スクリーンショット 2025-01-16 16.06.43.png

ガッツリ拒否されてそうですね。

補足

前述の通り、リージョン拒否コントロールはControl Towerに登録されたOUに対してSCPを付与する仕組みのため、管理アカウントへのリージョン制限はされません。

最後に

今回はControl Towerのリージョン拒否コントロールについてまとめてみました。

どなたかのお役に立てれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.